//
//  HomeTableViewController.swift
//  Sinaweibo
//
//  Created by 谌桃 on 15/11/27.
//  Copyright © 2015年 ryan.chen. All rights reserved.
//

import UIKit
import AFNetworking
import SVProgressHUD


//定义私有方法
private let identifierHomeCell = "identifierHomeCell"

class HomeTableViewController: BaseTableViewController {
    
    //懒加载数组属性
    private lazy var list = [Status]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //这里一定要先执行判断, 判断用户是否登录, 没有登录就进入访客视图界面, 然后直接返回, 不继续请求加载数据, 如果请求加载数据, 程序就会出现致命的错误, 因为没有登录就得不到token, 得不到token就无法得到用户信息, 也就无法加载数据, 这时强行加载数据, 就会出现错误
        
        //一定要注意语句执行顺序, 先判断是否登录, 如果登录了再去准备首页的tableViewCell, 没有登录就直接去访客视图, 知道登录成功后, 再去准备cell
        if !userLogin {
        
            visitorLoginView?.setWithInfo("关注一些人，回这里看看有什么惊喜,关注一些人，回这里看看有什么惊喜", imageName: nil)
            
            return
        }
        
        
        //准备tableView
        prepareCell()
        
        loadHomeData()
    
    }
    
    //MARK:提前准备好cell
    func prepareCell() {
        
        self.tableView.registerClass(StatusCell.self, forCellReuseIdentifier: identifierHomeCell )
        
        //先设置默认行高
//        tableView.rowHeight = 100
        
        //如果希望每条数据显示自身的行高, 必须设置两个属性, 1.预估行高, 2.自定义行高
        //如果要让自定义行高有效, 必须让容器视图有一个自下而上 的约束
        tableView.estimatedRowHeight = 200
        
        //设置定义行高
        tableView.rowHeight = UITableViewAutomaticDimension
        
        //取消分割线样式
        tableView.separatorStyle = .None
        
        //实例化刷新器
        refreshControl = UIRefreshControl()
        
        //给刷新器添加点击事件, 当值发生改变的时候, 就会调用该方法
        refreshControl?.addTarget(self, action: "loadHomeData", forControlEvents:.ValueChanged)
        //设置tableView footerView
        tableView.tableFooterView = indicator
    }
    
    private lazy var indicator: UIActivityIndicatorView = {
        let indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
        //        indicator.startAnimating()
        return indicator
        }()

    
    
    // MARK: - 微博API , 微博接口 , 读取接口 , ... home/timeline
    //AFN 网络加载数据
       @objc private func loadHomeData(){
        
        //开始刷新, 需要手动开启,
        //只能触发动画, 但不能主动触发响应事件
        refreshControl?.beginRefreshing()
        
        //定义source_id属性, 取出Status模型数组中的第一个对象的id, 记录下拉刷新
        var since_id = 0
        var max_id = 0
        if indicator.isAnimating() {
            //上拉加载更多
            since_id = 0
            max_id = list.last?.id ?? 0
        } else  {
            max_id = 0
            since_id = list.first?.id ?? 0
        }
        StatusListViewModel.loadData(max_id ,since_id:since_id) { (statuses) -> () in

        
        //数据加载结束后, 需要手动关闭
        self.refreshControl?.endRefreshing()
        
        guard let list = statuses else {
            
            //提高用户交互, 给用户提示
            SVProgressHUD.showErrorWithStatus(errorTip)
        
            return
        }
        
            //记录数组
            if since_id > 0 {
                //下拉刷新
                //拼接数组
                self.list = list + self.list
            } else if max_id > 0 {
                //上拉加载更多
                self.list += list
                //将标记复原 停止动画
                self.indicator.stopAnimating()
            } else {
                //首次
                self.list = list
            }
            //刷新表格
            self.tableView.reloadData()
        }
    }
   

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return list.count ?? 0
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        //如果使用这个方法获取cell, 并不用sb/xib ,就需要程序员手动注册
        let cell = tableView.dequeueReusableCellWithIdentifier(identifierHomeCell, forIndexPath: indexPath) as! StatusCell
        
        //将通过网络加载的字典数据 , 字典转模型后保存在list模型数组中, 定义list模型属性记录加载完成的数据, 并将完成的模型数据赋值给  cell 对应status属性
        cell.status = list[indexPath.row]
        
        //如果开始加载最后一条微博数据  就开启动画/ 加载数据
        if indexPath.row == list.count - 1 && !indicator.isAnimating(){
            indicator.startAnimating()
            //加载数据
            loadHomeData()
            
            print("静默加载")
        }

        
        return cell
        
    }
}
